﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using GestorDeFlotasDesktop.UILogic;
using GestorDeFlotasModelo.Entities;
using GestorDeFlotasModelo.Factorias;

namespace GestorDeFlotasDesktop.Facturar
{
    public partial class Facturar : BaseForm
    {
        private enum CalendarMode
        {
            FechaInicio, FechaFin
        }
        AbmCliente abmCliente = null;
        Cliente selectedCliente = null;
        private CalendarMode calendarMode;
        double importeTotal = 0;

        public Facturar()
        {
            InitializeComponent();
            abmCliente = new AbmCliente();
            abmCliente.Mode = FormMode.SelectItem;
            abmCliente.MantieneTransaccion = true;
            /// Este handler es para cuando desde el formulario de facturación quiero seleccionar un item.
            /// Se abre el listado de clientes y luego el usuario selecciona uno. 
            /// Se lanza este evento y se setea el SelectedClient en el formulario de facturación.
            /// Luego se cierra este listado.
            abmCliente.SelectingItem += new SelectedItemEventHandler(abmCliente_SelectingItem);
        }

        /// <summary>
        /// Esto es para cuando desde el formulario de facturación quiero seleccionar un item.
        /// Se abre el listado de clientes y luego el usuario selecciona uno. 
        /// Se lanza este evento y se setea el SelectedClient en el formulario de facturación.
        /// Luego se cierra este listado.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void abmCliente_SelectingItem(object sender, Cliente e)
        {
            selectedCliente = e;
            txtCliente.Text = e.Nombre + " " + e.Apellido;
            abmCliente.Hide();
            importeTotal = 0;
        }

        private void mcFechaInicio_DateSelected(object sender, DateRangeEventArgs e)
        {
            try
            {
                if (this.calendarMode == CalendarMode.FechaInicio)
                    txtFechaInicio.Text = e.Start.ToShortDateString();
                else
                    txtFechaFin.Text = e.Start.ToShortDateString();

                mcFechas.Visible = false;
                importeTotal = 0;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private void btnShowFechaInicio_Click(object sender, EventArgs e)
        {

            this.calendarMode = CalendarMode.FechaInicio;
            mcFechas.Visible = true;
        }

        private void btnFechaFin_Click(object sender, EventArgs e)
        {
            this.calendarMode = CalendarMode.FechaFin;
            mcFechas.Visible = true;
        }

        private void btnSelectCliente_Click(object sender, EventArgs e)
        {
            try
            {
                if (abmCliente.IsDisposed)
                {
                    abmCliente = new AbmCliente();
                    abmCliente.Mode = FormMode.SelectItem;
                    abmCliente.MantieneTransaccion = true;
                    abmCliente.SelectingItem += new SelectedItemEventHandler(abmCliente_SelectingItem);
                }
                abmCliente.Show();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private void btnGenerarFactura_Click(object sender, EventArgs e)
        {
            try
            {
                DateTime fechaInicio = DateTime.MinValue;
                DateTime fechaFin = DateTime.MinValue;

                if (!DateTime.TryParse(txtFechaInicio.Text, out fechaInicio))
                {
                    MessageBox.Show("La fecha de inicio ingresada es incorrecta");
                }
                if (!DateTime.TryParse(txtFechaFin.Text, out fechaFin))
                {
                    MessageBox.Show("La fecha de fin ingresada es incorrecta");
                }

                //Genero la factura en la base de datos.
                if (!ValidateFields() && importeTotal > 0)
                {
                    Factura factura= Transaccion.Factoria<FactoriaFactura>().Nuevo(selectedCliente, importeTotal, fechaInicio, fechaFin);
                    Transaccion.Persistir();
                    List<Viaje> viajes = Transaccion.Factoria<FactoriaViaje>().SelectPorClienteYFechas(selectedCliente, DateTime.Parse(txtFechaInicio.Text), DateTime.Parse(txtFechaFin.Text));
                    foreach (Viaje viaje in viajes)
                        viaje.Factura = factura;
                    Transaccion.Persistir();
                    this.Close();
                }
                
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private void CalcularImporteFactura_Click(object sender, EventArgs e)
        {
            try
            {
                if (!ValidateFields())
                {
                    //Selecciono los viajes comprendidos entre las fechas ingresadas por el usuario correspondientes 
                    //al cliente
                    List<Viaje> viajes = Transaccion.Factoria<FactoriaViaje>().SelectPorClienteYFechas(selectedCliente, DateTime.Parse(txtFechaInicio.Text), DateTime.Parse(txtFechaFin.Text));
                    gvItemsFactura.DataSource = viajes;
                    if (viajes.Count > 0)
                    {
                        //Traigo el importe total de la factura ya desde la BD.
                        importeTotal = Transaccion.Factoria<FactoriaViaje>().SelectImporteTotalFactura(selectedCliente, DateTime.Parse(txtFechaInicio.Text), DateTime.Parse(txtFechaFin.Text));
                        lblImporteTotal.Text = "El importe total de la factura es: " + importeTotal.ToString();
                        lblImporteTotal.Visible = true;
                        lblMensajeNoViajes.Visible = false;
                        btnGenerarFactura.Visible = true;
                    }
                    else
                    {
                        lblMensajeNoViajes.Visible = true;
                        btnGenerarFactura.Visible = false;
                    }
                }
                else
                {
                    importeTotal = 0;
                    lblImporteTotal.Visible = false;
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private double GetImporteTotal()
        {
            double importe = 0;

            foreach (DataGridViewRow row in gvItemsFactura.Rows)
            {
                importe += ((Viaje)row.DataBoundItem).PrecioViaje;
            }

            return importe;
        }

        private bool ValidateFields()
        {
            bool error = false;
            string errorMessage = string.Empty;

            if (selectedCliente == null)
            {
                error = true;
                errorMessage = "No has seleccionado ningún cliente.";
            } else {
                if (!selectedCliente.Habilitado)
                {
                    error = true;
                    errorMessage = "No se puede facturar a un cliente que no está habilitado.";
                }
            }

            if (String.IsNullOrEmpty(txtFechaFin.Text))
            {
                error = true;
                errorMessage = "No has seleccionado la fecha de fin";
            }

            if (String.IsNullOrEmpty(txtFechaInicio.Text))
            {
                error = true;
                errorMessage = "No has seleccionado la fecha de inicio";
            }

            if(errorMessage!="")
                MessageBox.Show(errorMessage);
            return error;
        }

        private void Facturar_Load(object sender, EventArgs e)
        {

        }
    }
}
